
#ifndef H_X_LOG_H_
#define H_X_LOG_H_
#include "x_logger.h"

namespace x_log
{

//日志模块初始化函数
/*
 *const string& logfile:输出的日志文件名称 /var/log/rundebug/X/X.log
 *                      如果日志文件文件名称为空,则默认输出到终端
 *const string& cfgfile:可选项,用于设置日志级别配置文件
 */
void init_cfg(const string& output_file, const string& cfg_file = "");

//设置日志级别
//example: procName:X LogLevel:TRACE/DEBUG/INFO/WARN/ERROR/FATAL
void set_log_level(const string& proc_name, const string& log_level);

//依据日志配置文件设置日志级别
/*
 * const string& procName:进程名称,比如X
 */
void set_log_level_by_config(const string& procName);


/*日志输出函数使用方法
 * int i = 1;
 * string str = "Hello World";
 * X_LOG_TRACE << i << str;
 * ===============================
 * 特别地: 日志消息换行请使用"\n",暂未兼容std::endl换行符
 * ================================
 *  提示: 不可以如下使用:
 * 
 *  if (true)
 *    X_LOG_INFO << "Good news";
 *  else
 *    X_LOG_WARN << "Bad news";
 * 
 *  this expends to
 * 
 *  if (true)
 *    if (logging_INFO)
 *      logInfoStream << "Good news";
 *    else
 *      logWarnStream << "Bad news";
 * 
 */
#define X_LOG_TRACE if (x_log::CLogger::logLevel() <= x_log::CLogger::X_TRACE) \
  x_log::CLogger(__FILE__, __LINE__, x_log::CLogger::X_TRACE, __FUNCTION__).stream()

#define X_LOG_DEBUG if (x_log::CLogger::logLevel() <= x_log::CLogger::X_DEBUG) \
  x_log::CLogger(__FILE__, __LINE__, x_log::CLogger::X_DEBUG, __FUNCTION__).stream()

#define X_LOG_INFO if (x_log::CLogger::logLevel() <= x_log::CLogger::X_INFO) \
  x_log::CLogger(__FILE__, __LINE__, x_log::CLogger::X_INFO, __FUNCTION__).stream()

#define X_LOG_WARN x_log::CLogger(__FILE__, __LINE__, x_log::CLogger::X_WARN, __FUNCTION__).stream()

#define X_LOG_ERROR x_log::CLogger(__FILE__, __LINE__, x_log::CLogger::X_ERROR, __FUNCTION__).stream()

#define X_LOG_FATAL x_log::CLogger(__FILE__, __LINE__, x_log::CLogger::X_FATAL, __FUNCTION__).stream()

//用于输出系统级别的错误信息,输出errno
#define X_LOG_SYSERR x_log::CLogger(__FILE__, __LINE__, errno).stream()

} //namespace x_log

#endif


